package cn.dengta.webapp.im.dto;

import java.util.List;
import java.util.Map;

import cn.dengta.common.context.Env;
import cn.dengta.common.model.ValueProxy;
import cn.dengta.common.model.ValueProxyImpl;
import cn.dengta.context.model.WesKit;
import lombok.*;
import me.codeplayer.util.X;

/**
 * 速配配置
 */
@Getter
@Setter
public class SpeedDatingConfig {

	/** 分包配置 */
	private Map<WesKit, SpeedConfig> config;
	/** 礼物引导ID */
	private Map<WesKit, Long> gift;
	/** 速配价格 */
	private Map<WesKit, SpeedPrice> speedPrice;

	/** 是否允许重复匹配（目前仅支持双方均在池内时） */
	transient boolean allowRematch = Env.inner();

	public SpeedConfig findConfig(WesKit wesKit) {
		return X.isValid(this.config) ? this.config.get(wesKit) : new SpeedConfig();
	}

	public Long findGiftId(WesKit wesKit) {
		return X.isValid(this.gift) ? this.getGift().get(wesKit) : null;
	}

	public boolean canSpeedPrice(WesKit wesKit) {
		return true;
	}

	public SpeedPrice findSpeedPrice(WesKit wesKit) {
		return X.isValid(this.speedPrice) ? this.speedPrice.get(wesKit) : new SpeedPrice();
	}

	/** 面向人群条件 */
	@Getter
	@Setter
	public static class Condition {

		/**
		 * @see ConditionType
		 */
		private Integer type;
		/** 对应类型的值 */
		private Integer value;

	}

	@Getter
	public enum ConditionType implements ValueProxyImpl<ConditionType, Integer> {
		/** 多少天内注册的用户 */
		REG_TIME(0, "注册时间"),
		/** 未充值男用户 */
		UN_RECHARGE_MALE(1, "未充值男用户"),
		/** 未接听过破冰视频 */
		UN_ANSWER_ICE(2, "未接听过破冰视频"),
		;
		private ValueProxy<ConditionType, Integer> proxy;

		ConditionType(Integer value, String label) {
			this.proxy = new ValueProxy<>(this, value, label);
		}

		public static ConditionType of(Integer value) {
			return REG_TIME.getValueOf(value);
		}
	}

	@Getter
	@Setter
	public static class SpeedConfig {

		/** 【池外用户的】接听超时时间（单位：s）。默认是 6s，但为了避免数据通信的时间延迟，所以自动延迟 1s，即 7s */
		int joinTimeout = 21;
		/** 开启匹配的延迟秒数（单位：s） */
		int matchDelaySeconds = 1;
		/** 男用户单次匹配的超时时间（单位：s），在指定时间内未匹配成功，则自动退出匹配 */
		int maleMatchTimeout = 60;

		/** 根据运营要求，男用户首次速配有 30s 的免费通话时长赠送，只有主动点击加入速配的男用户才会有 */
		int maleFreeSeconds = 30;

		/** 每天破冰的次数上限 */
		Integer iceBreakingTimes = 5;
		/** 两次破冰之间的最小时间间隔（分钟） */
		long iceBreakIntervalTime = 0;
		/** 登录多少秒后才能开始速配 */
		Integer loginSecs = 0;

		/**
		 * 面向人群
		 *
		 * @see Condition
		 */
		List<Condition> groupPeople;

		/** 毫秒数 */
		public long caleIceBreakIntervalTime() {
			return this.iceBreakIntervalTime * 60 * 1000;
		}

	}

	/**
	 * 聊天价格
	 */
	@Getter
	@Setter
	@NoArgsConstructor
	public static final class SpeedPrice {

		/** true=独立配置；false=通用1V1聊天配置 */
		private Boolean main = Boolean.FALSE;

		/** 语音聊天价格（钻石/分钟） */
		private Integer audio = 0;
		/** 视频聊天价格（钻石/分钟） */
		private Integer video = 0;

	}

}
